﻿using NDF.Web.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace System.Web.Mvc
{
    /// <summary>
    /// 表示用户定义的内容类型，该类型是操作方法的结果，同时提供一种用于返回带特定 HTTP 响应状态代码和说明的操作结果的方法。
    /// </summary>
    public class HttpStatusCodeContentResult : HttpStatusCodeResult
    {
        /// <summary>
        /// 以指定的初始参数创建一个 <see cref="System.Web.Mvc.HttpStatusCodeContentResult"/> 对象。
        /// </summary>
        /// <param name="statusCode">表示 HTTP 状态码。</param>
        public HttpStatusCodeContentResult(int statusCode) : base(statusCode)
        {
        }

        /// <summary>
        /// 以指定的初始参数创建一个 <see cref="System.Web.Mvc.HttpStatusCodeContentResult"/> 对象。
        /// </summary>
        /// <param name="statusCode">表示 HTTP 状态码。</param>
        public HttpStatusCodeContentResult(HttpStatusCode statusCode) : base(statusCode)
        {
        }

        /// <summary>
        /// 以指定的初始参数创建一个 <see cref="System.Web.Mvc.HttpStatusCodeContentResult"/> 对象。
        /// </summary>
        /// <param name="statusCode">表示 HTTP 状态码。</param>
        /// <param name="statusDescription">表示 HTTP 状态描述。</param>
        public HttpStatusCodeContentResult(HttpStatusCode statusCode, string statusDescription) : base(statusCode, statusDescription)
        {
        }

        /// <summary>
        /// 以指定的初始参数创建一个 <see cref="System.Web.Mvc.HttpStatusCodeContentResult"/> 对象。
        /// </summary>
        /// <param name="statusCode">表示 HTTP 状态码。</param>
        /// <param name="statusDescription">表示 HTTP 状态描述。</param>
        public HttpStatusCodeContentResult(int statusCode, string statusDescription) : base(statusCode, statusDescription)
        {
        }

        /// <summary>
        /// 以指定的初始参数创建一个 <see cref="System.Web.Mvc.HttpStatusCodeContentResult"/> 对象。
        /// </summary>
        /// <param name="content">表示用于定义的 HTTP 请求响应。</param>
        public HttpStatusCodeContentResult(HttpContent content) : this(HttpStatusCode.OK, content)
        {
        }

        /// <summary>
        /// 以指定的初始参数创建一个 <see cref="System.Web.Mvc.HttpStatusCodeContentResult"/> 对象。
        /// </summary>
        /// <param name="statusCode">表示 HTTP 状态码。</param>
        /// <param name="content">表示用于定义的 HTTP 请求响应。</param>
        public HttpStatusCodeContentResult(int statusCode, HttpContent content) : this(statusCode)
        {
            this.HttpContent = content;
        }

        /// <summary>
        /// 以指定的初始参数创建一个 <see cref="System.Web.Mvc.HttpStatusCodeContentResult"/> 对象。
        /// </summary>
        /// <param name="statusCode">表示 HTTP 状态码。</param>
        /// <param name="content">表示用于定义的 HTTP 请求响应。</param>
        public HttpStatusCodeContentResult(HttpStatusCode statusCode, HttpContent content) : this(statusCode)
        {
            this.HttpContent = content;
        }


        /// <summary>
        /// 表示用于定义的 HTTP 请求响应。
        /// </summary>
        public HttpContent HttpContent
        {
            get;
            protected internal set;
        }

        /// <summary>
        /// 通过从 System.Web.Mvc.ActionResult 类继承的自定义类型，启用对操作方法结果的处理。
        /// 该方法会将设定的 <see cref="System.Web.Mvc.JsonStatus"/> 结构类型参数解析成 Json 数据格式并通过 HttpResopnse 输出至客户端。
        /// </summary>
        /// <param name="context">用于执行结果的上下文。上下文信息包括控制器、HTTP 内容、请求上下文和路由数据。</param>
        public override void ExecuteResult(ControllerContext context)
        {
            base.ExecuteResult(context);
            HttpResponseBase response = context.HttpContext.Response;

            if (!String.IsNullOrEmpty(this.HttpContent.ContentType))
            {
                response.ContentType = this.HttpContent.ContentType;
            }
            if (this.HttpContent.ContentEncoding != null)
            {
                response.ContentEncoding = this.HttpContent.ContentEncoding;
            }
            if (this.HttpContent.Content != null)
            {
                response.Write(this.HttpContent.Content);
            }
        }
    }
}
